export class SingleListNode {
  val = "";
  next = null;

  firstNode = null; // 头节点
  lastNode = null; // 尾节点
  size = 0; // 链表长度

  constructor(val, next) {
    this.val = val;
    this.next = next;
  }

  // 往头部添加节点
  addFirst(val) {
    // 首先获取之前的头节点
    const node = this.firstNode;
    // 创建一个新节点
    const newNode = new SingleListNode(val, node);
    // 将新节点设置为头节点
    this.firstNode = newNode;
    // 如果链表为空，则将尾节点也设置为该节点
    if (!this.lastNode) {
      this.lastNode = newNode;
    }
    this.size++;
  }

  // 往尾部添加节点
  addList(val) {
    // 获取之前的尾节点
    const node = this.lastNode;
    // 创建一个新节点
    const newNode = new SingleListNode(val, null);
    // 将新节点设置为尾节点
    this.lastNode = newNode;
    // 如果链表为空，则将头节点也设置为该节点
    if (!this.firstNode) {
      this.firstNode = newNode;
    } else {
      node.next = newNode;
    }
    this.size++;
  }

  // 遍历链表
  traverse() {
    let node = this.firstNode;
    while (node) {
      console.log(node.val);
      node = node.next;
    }
  }

  // 获取指定位置的节点
  getNode(index) {
    let node = this.firstNode;
    let i = 0;
    while (node) {
      if (i === index) {
        return node;
      }
      node = node.next;
      i++;
    }
    return null;
  }

  // 删除指定位置的节点
  removeNode(index) {
    if (index < 0 || index >= this.size) {
      return;
    }
    if (index === 0) {
      // 如果删除第一个，则吧第二个作为头节点
      this.firstNode = this.firstNode.next;
      this.size--
    }else if (index === this.size - 1) {
        // 如果删除的是最后一个，则吧倒数第二个作为尾节点
        let newLastNode = this.getNode(index - 1);
        newLastNode.next = null;
        this.lastNode = newLastNode;
        this.size--
    }else{
        // 如果删除中间节点，则吧前一个节点的next指向后一个节点
        let preNode = this.getNode(index - 1);
        preNode.next = preNode.next.next;
        this.size--
    }
  }
}
